/*
* @Author:Iyoole
* @Time  :2017-11-09
* @Description:模板填充
* @git:
* */

//时间格式化
Date.prototype.Format = function(fmt) {
    var o = {
        "M+": this.getMonth() + 1,
        "d+": this.getDate(),
        "h+": this.getHours(),
        "m+": this.getMinutes(),
        "s+": this.getSeconds(),
        "q+": Math.floor((this.getMonth() + 3) / 3),
        "S": this.getMilliseconds()
    };
    if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
    for (var k in o) if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
    return fmt
};

;!function(e){
    "use strict";
    var i,ng=['ng-if','ng-show','ng-hide','ng-class','ng-src','ng-repeat'],
        c={
        exp:function(a){
            return new RegExp(a,"g")
        }
        ,io:function(a,b){
            return a.indexOf(b)>0
        }
        ,ii:function(a,b){
            return a in b
        }
        ,isFun:function(f,n){
            try{
                f = eval(f);
            }catch (e){
                return "false"
            }
            if (typeof f === 'function'){
                return f.call(this,n);
            }
        }
    },fn={
        TimeY:function(t){//只显示年
            if(t=='isTplNull') return '';
            try{
                return new Date(t).Format('yyyy')
            }catch(e){
                t=typeof t==='number'?t:parseInt(t);
                if(!t) return '';
                return new Date(t).Format('yyyy')
            }
        },
        TimeYM:function(t){//只显示年月
            if(t=='isTplNull') return '';
            try{
                return new Date(t).Format('yyyy-MM')
            }catch(e){
                t=typeof t==='number'?t:parseInt(t);
                if(!t) return '';
                return new Date(t).Format('yyyy-MM')
            }
        },
        TimeYMD:function(t){//只显示年月日
            if(t=='isTplNull') return '';
            try{
                return new Date(t).Format('yyyy-MM-dd')
            }catch(e){
                t=typeof t==='number'?t:parseInt(t);
                if(!t) return '';
                return new Date(t).Format('yyyy-MM-dd')
            }
        },
        TimeA:function(t){//格式1988-10-16 12:34:56
            if(t=='isTplNull') return '';
            try{
                return new Date(t).Format('yyyy-MM-dd hh:mm:ss')
            }catch(e){
                t=typeof t==='number'?t:parseInt(t);
                if(!t) return '';
                return new Date(t).Format('yyyy-MM-dd hh:mm:ss')
            }
        },
        TimeS:function(t){//格式1558885555
            t=typeof t==='string'?t:t.toString();
            t=t.replace(/-/g,'/');//fix ios
            return new Date(t).getTime();
        },
        Checked:function(c){
            return !c?'':'checked';
        },
        sex:function(s){
           return s==1?'男':'女'
        }
    };


    var Tpl=function(tag){
        this.tag=tag?i(tag):'';
    };
    Tpl.pt=Tpl.prototype;
    Tpl.pt.render=function(d,tpl,page,pageSize){
        var t=this;
        if(!d) return console.error('JsTpl Say:No Data');
        d=typeof d==='object'?d:JSON.parse(d);
        tpl=i('#'+tpl).html().replace(c.exp('[\r\t\n]'),"").replace(c.exp('>\\s+([^\\s<]*)\\s+<'),">$1<");
        t.cache=d;t.tpl=tpl;t.page=page||'-1';t.pageSize=pageSize||10;
        t.tpl=t.repeat();
        t.tpl=t.parse(t.tpl,t.cache);
        t.ngIf();
        var $div=i("<div/>").append(t.tpl);
        $div.find('[destroy]').remove();
        $div.find('[ngShow]').addClass('ng-show').removeAttr('ngShow');
        $div.find('[ngHide]').addClass('ng-hide').removeAttr('ngHide');
        i.each($div.find('[ngClass]'),function(x,y){
            var v=i(y).attr('ngClass');
            i(y).addClass(v).removeAttr('ngClass');
        });
        if(t.tag){
            t.tag.empty().append($div.html());
        }else{
            return $div.html()
        }
    };
    Tpl.pt.parse=function(tpl,d){
        var t=this;
        return tpl.replace(c.exp('{{([\\w\\-\\.\\|\\@\\^]+)}}'),function(m,n){
            var nn=t.fun(n,d);
            return nn==='isTplNull'?'':(typeof nn==='object')?JSON.stringify(nn):nn;
        });
    };
    Tpl.pt.each=function(ar,z){
        var t=this,nd='',pn=t.page=='-1'?0:(t.page - 1)*t.pageSize;
        var nz;
        if(ar=='isTplNull') return '';
        ar='string'===typeof ar?JSON.parse(ar):ar;
        i.each(ar,function(m,d){
            d.ngRid=pn + m + 1;
            nz=z.replace(c.exp('<ngc-repeat.*?repeat="([^\\s]+)".*?>(.*)?<\/ngc-repeat>'),function(ca,cb,cc){
                var sd='';
                i.each(ar[m][cb],function(x,y){
                    y.ngRid=x + 1;
                    sd+=t.parse(cc,y);
                });
                ar[m][cb]=sd;
                return '{{'+cb+'}}';
            });
            nd+=t.parse(nz,d)
        });
        return nd;
    };
    Tpl.pt.isOr=function(tpl,d){//判断是否是‘或’选择
        var t=this;
        if(c.io(tpl,'|')){
            var na=tpl.split('|'),rd='isTplNull';
            for(var i=0;i<na.length;i++){
                var nd=t.dot(na[i],d);
                if(nd!=rd&&(typeof nd!='object')&&nd!=''){
                    rd=t.dot(na[i],d);
                    break;
                }
            }
            return rd;
        }else{
            return t.dot(tpl,d);
        }
    };
    Tpl.pt.dot=function(tpl,d){//多级
        var t=this,pd=tpl.split('^');
        if(pd.length==2){
            return t.cache[pd[1]]
        }
        var nd=tpl.split('.');
        var dd=i.extend(true,{},d);
        (function poll(l) {
            var l=l||0;
            if(l<nd.length){
               if(typeof dd[nd[l]]==='object'&&dd[nd[l]]!=null){
                   dd=dd[nd[l]];
                   l++;
                   poll(l)
               }else{
                   dd=(l==nd.length-1)&&(typeof dd[nd[l]]==='string'||typeof dd[nd[l]]==='number'||((typeof dd[nd[l]]==='boolean')&&dd[nd[l]]))?dd[nd[l]]:'isTplNull';
               }
            }
        })();
        return dd;
    };
    Tpl.pt.fun=function(tpl,d){
        var t=this;
        if(c.io(tpl,'@')){
            var nd=tpl.split('@');
            if(c.ii(nd[1],fn)){
                return fn[nd[1]].call(t,t.isOr(nd[0],d))
            }else{
                return c.isFun(nd[1],t.isOr(nd[0],d))
            }
        }else{ return t.isOr(tpl,d)}
    };
    Tpl.pt.ngIf=function(){
        var t=this;
        t.tpl=t.tpl.replace(c.exp(ng[0]+'="([^"]*)"'),function(m,n){
            if(n.indexOf('!=isNull')!=-1){
                if(n.split('!=')[0]!='') return ''
            }
            if(n=='null'||n=='false'||n=='0'||n==''||n=='!!'){
                return "destroy"
            }else if(n=='!'){
                return ''
            }else{
                try{
                    n=eval(n);
                    return !n?'destroy':''
                }catch (e){
                    return "destroy"
                }
            }
        });
        t.ngShow();t.ngSrc();t.ngClass();
    };
    Tpl.pt.ngShow=function(){
        var t=this;
        t.tpl=t.tpl.replace(c.exp(ng[1]+'="([^"]*)"'),function(m,n){
            if(n=='null'||n=='false'||n=='0'||n==''){
                return ""
            }else{
                try{
                    n=eval(n);
                    return !n?'':'ngShow'
                }catch (e){
                    return ""
                }
            }
        }).replace(c.exp(ng[2]+'="([^"]*)"'),function(m,n){
            if(n=='null'||n=='false'||n=='0'||n==''){
                return ""
            }else{
                try{
                    n=eval(n);
                    return !n?'':'ngHide'
                }catch (e){
                    return ""
                }
            }
        });
    };
    Tpl.pt.ngClass=function(){
        var t=this;
        t.tpl=t.tpl.replace(c.exp(ng[3]+'="([^"]*)"'),function(m,n){
            if(c.io(n,'-')){
                var y=n.substring(n.lastIndexOf('-')+1),x=n.substring(0,n.lastIndexOf('-'));
                if(y=='null'||y=='false'||y=='0'||y==''){
                    return ''
                }else{
                    try{
                        y=eval(y);
                        return !y?"":'ngClass='+x
                    }catch (e){
                        return ''
                    }
                }
            }else{
                return ''
            }
        });
    };
    Tpl.pt.ngSrc=function(){
        this.tpl=this.tpl.replace(c.exp(ng[4]+'="([^"]*)"'),'src="$1"')
    };
    Tpl.pt.repeat=function(){
        var t=this,eh='</'+ng[5]+'>';
        return t.tpl.replace(c.exp('<'+ng[5]+'.*?>([^'+eh+']+)?'+eh),function(m){
            return m.replace(c.exp('<'+ng[5]+'.*?repeat="([^"]+)".*?>(.*)?'+eh),function(q,w,z){
                var ar=t.fun(w,t.cache);
                ar=!ar?[]:ar;
                w=w.replace(/\./g,'_');
                t.cache['re'+w+'list']=t.each(ar,z);
               return "{{re"+w+"list}}"
            });
        });
    };

    var JsTpl=function(tag){
        //if(!tag) return console.error('JsTpl Say:No Receptacle');
        return new Tpl(tag)
    };
    JsTpl.v='2.0.42';
    if(window.fui && fui.define ){
        fui.define('jquery', function(exports){
            e.JsTpl=JsTpl;
            i=fui.$;
            exports('JsTpl', JsTpl);
        });
    }else{//如果直接引用的话
        e.JsTpl=JsTpl;
        i=e.jQuery;
    }
}(window);

/*
* 逻辑
* fun>or>.-->先判断是否有方法
* */


/*
 * 说明文档
 * 功能：实现模板与数据分离
 * 参数说明：
 * {{key}}  ----直属对象值
 * {{key1.key2}} ---- 对象子值(支持多级)
 * {{key1|key2}} ---- key1值存在时取key1否则取key2
 * {{key@fun}}   ---- 获取到key以后会经过fun处理在返回(内置部分时间格式处理,默认选中)
 *
 * ng-if  --- 不能用单引号   正确格式为 ng-if="{{key}}"
 * ng-if="{{key}}" ---  当key为false,0,null,空时将移除此dom
 * ng-if="{{key}}=='val'" ----ng-if根据后面条件结果做处理
 *
 * ng-show --- 同ng-if,不同之处在于此dom是存在的
 * ng-hide --- 同ng-hide 不同在于是添加ng-hide而不是去掉ng-show
 *
 * ng-class
 * ng-class="className-{{key}}" --- 当key不为空、false、null时添加className(自定义类名)
 *
 * ng-src
 * ng-src="{{key}}"  --- src="key"
 *
 * ng-repeat
 * <ng-repeat repeat="">
 *      循环体
 *      <ngc-repeat>
 *          子循环
 *      </ngc-repeat>
 * </ng-repeat>
 * */

/*
* 更新
* 2.0.2
* 新增不传容器返回内容
* 2.0.3
* 修复传来日期字符串引起的1970问题
* 2.0.4
* 当传入的数组是字符串时转json
* 2.0.41
* 临时添加从根级选对象   例：var a={m:'123',n:[{},{}]};----->{{^m}}   当在n对象里面时,要读取m的值可以这样暂时用一下
* 2.0.42
* 增加条件判断  !与!!
* */
